公钥密码学浅析
一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:16004488
微信公众号:计算机与网络安全
ID:Computer-network
一、公钥密码学的基础
公钥密码学是在20世纪70年代中期随着一些著作的出版而出现的,这些著作是由Whitfield Diffie、Martin Hellman以及Ralph Merkle所发表的,对密码学及其应用产生了深远的影响。公钥密码学的基本概念是:加密、解密过程需要双钥,公钥和私钥。私钥必须保密,而公钥则是可以自由发布的。用公钥加密的数据只有使用相应的私钥才能破解,反之亦然。
下面,我们假设一个简单的例子,用来说明了公钥加密学系统中的双钥原理。我们限制明码文本只包含26个英文字母和空格——共27个字符。然后用整数[0…26]依次赋值给那些明码文本,空格赋值为26。我们认为加密功能E是仿射变换,它只接收明文P,并把它,映像成密文C,如下:
E(P)=(a×P+b) mod 27=C
其中a、b为固定整数。前面等式中,若用C表示P 就是其逆运算,解码运算D。
D(C)=(a′×C+b′) mod 27
这里 a′=a–1mod 27,b′=-a–1×b
由于要求当计算Z/27Z时a有逆,所以,其充要条件就是a和27互素。也就是说,a和27 除了1外没有公约数。注意:这种情况是为了保证在P和C之间有一一映射关系。Z/27Z是以27为模的同余数集合。
该例子中的参数化仿射变换及其逆运算可以组成一个简单的公钥密码系统,其中密钥和公钥分别为(a,b)和(a′,b′)。比如可设 a=2,b=1,(a′,b′)=(14,-14)。当设a=1时,就会发生一个特殊情况,这时会产生一个具有固定移位常量b(在[0…26]之间)的移位变换。如下:
(a,b)=(a′,b′)=(1,b)
不过实际上,这种公钥密码系统很容易被攻破,即使设置为一般化的长块而不是单个字符。S大小的长块所产生密码变换,将把每一块映射到0到Ns-1的一个值,这里的N表示字母表的大小。这个算法的缺点在于使用很简单的操作(以(N-1)为模的乘法和加法)就很容易从加密密钥中推断出解密密钥。不过首先,我们需要注意到这种算法中加密函数有一个确定的逆函数。
公钥加密算法的主要假设是:知道公钥后得出密钥在计算复杂度方面是无法实现的。图1说明了公钥密码学的原理。
图1 公钥加密原理
现代公钥密码学具有严格的数学基础,该数学基础是基于数论的one-way trapdoor函数:正向计算很容易,而逆向则相当困难。如果在 one-way trapdoor中加密是简单的,则解密是难的方向。只有知道 trapdoor知识(密钥)后才能像加密一样简单地进行解密。现在两个著名的trapdoor one-way函数奠定了现代公钥密码学的基础。
(一)大数分解问题
我们最先介绍的trapdoor函数是这样的一个问题,计算两个大素数的乘积相当容易;反之,将大数因式分解则是一个复杂得多的问题。因式分解一个整数n就是一个寻找一连串的素数,使得这些素数的乘积等于 n。素数的定义是只能被 1 和它本身整除的整数,不是素数的整数叫合数。因式分解一个大整数(超过1024bit)的计算复杂度,对于当今的计算机技术已知是不可行的。因此,这里的 one-way trapdoor 问题就是产生并公开一个大整数,但是隐藏起它的质因子。注意,这里讨论的 trapdoor 函数要求对随机挑选的非常大的数是否是素数作出判断。实际上素数判断比因数分解要简单得多。
已设计出大量的方法来判断一个奇数N是否是素数。最烦琐的办法就是用从3开始的奇数逐一除N,看有没有一个奇数能整除N。这个过程一直延续到除数小于等于
(二)RSA算法
下面是要获得RSA加密系统的密钥/公钥对的必要步骤。
随机挑选两个大素数p,q(100~200位数字)。计算它们的乘积n=p×q。
计算¢(n)=(p-1)×(q-1)=n+1-p-q。
随机选择另一个数e,满足e和¢(n)互素;也就是e和¢(n)只有公约数1。
然后使用扩展的欧几里德算法计算e的模¢(n)乘法逆d,即e×d mod ¢(n)=1。
数e和数n产生公钥,它们分别为指数和模。d和n产生密钥。加密和解密的逆函数简单地由模减操作组成,该操作是把 Z/nZ的一个元素映射成 Z/nZ的另一个元素,这里,Z/nZ是一系列以n为模的同余集合。由于任何明文T的块,有下列等式:
C=f(T)=Temod n,T=f-1(C)=Cdmod n
使用减模技术,比如通过我们反复减模方法,可以对这一算法进行计算上的优化。
RSA算法围绕三个数展开:公开指数e,私有指数d,还有模n。公开值和私有值都利用了相同的模值,它们互为模为¢(n)下的幂逆,值小于模的明文升幂到e mod n以便产生密文,而密文也将升幂到d mod n以便产生明文。
(三)计算模的幂
为了加密或解密一段报文,RSA算法把或明文或密文形式的数据块看成一个大数,然后就可以升到一个大的幂值。注意,这儿的块大小要适当,应该比模值小。如果没有幂的模等于模的幂这一特性,计算这样的幂值是很耗时的。这一属性使得可以通过连续的平方运算得到幂的模。如,对某一整数a求8次幂的模,不必要进行7次大整数乘法,然后再进行1次大整数取模运算,可以使用3次乘法和3次小整数取模运算:
a8mod n=((a2modn)2mod n)2modn
即使幂值不是2、4、8等值,这一操作仍然是成立的。
考虑下列例子,计算 399157mod 457。
首先,注意:157=128+16+8+4+1
现在我们执行下面的迭代计算:
399 mod 457=399 相当于3991mod 456
3992=159201,159201 mod 457=165,相当于3992mod 457
1652=27225,27225 mod 457=262,相当于3994mod 457
2622=68644,68644 mod 457=94,相当于3998mod 457
942=8836,8836 mod 457=153,相当于39916mod 457
1532=23409,23409 mod 457=102,相当于39932mod 457
1022=10404,10404 mod 457=350,相当于39964mod 457
3502=122500,122500 mod 457=24,相当于399128mod 457
因此
399157mod 457=24×153×94×262×399 mod 457
因为
(a×b) mod n=((a mod n)×(b mod n)) mod n
这计算可依次分裂成:
24×153 mod 457=16,94×262×399 mod 457=158
最后就是,
399157mod 457=16×158 mod 457=243
破解RSA算法被认为等价于为因式分解两个大素数的乘积。这是因为必须把模从公钥值中取出,然后对它进行因式分解。据已知最快的因式分解算法计算,该算法的复杂度为:
级,这里n等于模值的二进制位的总数。这大致意味着每增加的10位使模因式分解难10倍。根据目前因数分解的情况推断,在将来,2048bit的密钥更安全。至今为止,已知的最快的因式分解算法是数域筛法。
(四)在大的有限域中计算离散对数
第二个著名的数论中的trapdoor one-way函数基于这样一个问题,在一个大的有限域中,计算一个整数的幂值是很容易的,然而计算其逆函数,即它的离散对数,则要困难得多。有限域,也称为Galois域,用GF(p)来表示。Galois域是一个以素数p为模的域,因此,GF(p)中的每个元素a都有一个模乘的逆元素a-1,有 a×a-1=1 mod p。
在Z/pZ中,计算f(x)=ax=y的复杂度是log x的多项式级别的。给出y计算x=f--1(y)=loga(y)的问题,即离散对数问题,则要复杂得多。这里,x和y都受限于Z/pZ离散集合中,这与连续情况下求对数有所不同。使用离散来限定之后,情况要难得多。
离散对数问题定义的one-way trapdoor函数陈述如下:
已知a、x,很容易计算Z/pZ中的ax(使用反复自乘法)。但是,如果我们隐藏 x值,并向一些人提交y值(我们知道这是ax形式),并要求计算是a的多少次幂;它们可能即使用完它们可能获得的所有计算资源,仍然不能给出一个确定的答案。
许多现代公钥加密算法都基于离散对数 one-way trapdoor函数。由于这些算法的简易性,我们把使用ElGamal加密系统和Diffie-Hellman密钥交换算法当作离散对数过程的典型例子。
(五)ELGamal 密码系统
这里,私有的解密密钥x是从一个非常大的有限域GF(p) (0<x<p-1)中随机挑选出的数,与此相同,另一个数g也是在GF(p)中随机挑选的。在GF(p)上得出公钥gx。加密一块明码文本T由这样几步构成,首先随机挑选一个随机数字k,然后在GF(p)中计算密码对
(C1,C2)=(gk,Tgxk)
注意,这里计算(gxkmod p)并不要求知道x。
为了解密密文(C1,C2),我们计算
因为在GF(p)中,我们有
Tgxk/(gk)x=T
值得注意的是,这种加密算法所产生的密文是明文文本的大小的两倍。ElGamal 算法起源于一个数字签名方案,因此它通常被用于数字签名和加密中。
(六)Diffie-Hellman密钥交换系统
使用Diffie-Hellman密钥协商算法,可以通过公网在两实体间建立加密密钥而不需要直接交换这一密钥。这样它对于密钥发布的问题提供了一个优秀的解决方案。该算法的安全性与离散对数问题中的one-way trapdoor函数算法的安全有关。这一算法中涉及的数学问题相当简单,首先,两个实体协商出一个大素数n,以及另外一个模n后为素数的数g,后一个特性确保对于在Z/pZ范围内的每个数,也就是从1到p-1间的数,都有某个值a满足ga=b mod p。
这两个值g、n可在公网上进行交换,每个实体,如A、B然后就可以根据下面的步骤产生密钥:
A随机选择一个大数x,并传给B
B随机选择一个大数y,并传给A
A通过计算推导出密钥:
X=gxmod n
Y=gymod n
K=Yxmod n=(gymod n)xmod n=gxymod n
B也通过计算推导出相同的密钥:
K=Xymod n=(gxmod n)ymod n=gxymod n
这样,A和B不一定要经过交换秘密消息也能确定共有的密钥。这一点可以在传统的密钥密码学中的密钥发布中得到有效使用。注意,该密钥协商过程的安全性基于:只是知道gx和gy的值是无法求得gxy的。
(七)椭圆曲线加密系统
已经有基于有限域上的椭圆曲线问题的公钥加密系统[KOBL87,MILL86]了。已知一椭圆曲线E上的一点P,以及一个整数a,计算乘积a×P相对容易,而已知a×P的值后求a以使a×P产生一个在E上的点则要难得多。这一问题的一个简单的应用就是在Diffie-Hellman算法中,两实体A、B公开协商出E上的一点P。为了生成密钥,发起方A选择一个随机的大整数a,在E上计算a×P,并把它传给实体B。B作一个类似的计算,并把b×P的结果传给A。两个实体然后计算出密钥:K=a×b×P,该点在E上。
二、公钥加密服务
(一)保密性
显然,公钥密码系统可以用来加密数据。加密的强度是由所使用的特定算法和所采用的密钥长度所决定的。通常,每个算法的健壮性与所使用的 one-way trapdoor 函数的类型直接相关。我们已经讨论过的因式分解一个大数和计算离散对数问题,在现有的计算方法范围内,或在现有的理论体系中,是安全的方法。
RSA算法是目前最广泛使用的公钥加密算法。这一服务的前提是:只有使用接收者的公钥才能加密数据,只有使用接收者的私钥才能解密,因此,只有知道私钥的接收者才能解开加过密的数据。值得注意的是,这种服务要求公钥属于接收者所有。
(二)数据源认证
这个服务要求使用私钥进行数据加密,因为私钥只有所有者知道,则使用相应的公钥进行解密就能够自动对对方进行身份认证。使用公钥进行加密,私钥进行解密则不能确定数据源。不过,实际中一般使用数字签名进行数据源认证,这样可以避免加密大量数据。
(三)数据完整性
使用可公开获得的公钥进行加密以保护数据的机密性。不过这样,窃听者也可以中途拦截数据,用新数据替换旧数据,并用相同的公钥进行加密。在使用某个公钥算法保证数据的机密性的同时,是无法同时保证数据的完整性的。而采用另外一种方案,即用私钥加密数据而采用公钥进行解密,虽然可以得到数据完整性,却无法保证数据机密性。图2说明了当使用公钥加密算法时,数据保密性和完整性之间的关系。
图2 当使用公钥加密算法时,实现数据的完整性和保密性
数据源认证、完整性和保密性服务可以通过同时使用公钥加密算法和我们下面要谈到的数字签名而同时实现。
(四)抗抵赖服务
根据公钥密码学的基本前提,私钥只是所有者具有,因此,如果能够使用相关公钥进行解密,那么所有者就无法抵赖。然而,若私钥丢失或被破解,那么所有者就可以否认。对于强度较高的抗抵赖服务来说,私钥从来不会暴露出去,即使所有者都无法看到。可以保护私钥的防篡改硬件对于建立这样的服务是十分必要的。
(五)密钥发布
公钥密码学可用来在一个公网上建立密钥连接。简单说来,现在会话密钥成为了需要秘密传输的数据内容,会话密钥用对方的公钥来进行加密,接收方用自己的私钥解开数据内容,然后双方建立了共同的会话密钥。注意,需要对发送方的身份进行严格认证,如果破解了密钥协商的过程,那么以后的所有数据交换内容都会被暴露。
1、Diffie-Hellman
Diffie-Hellman算法是密钥协商过程的经典选择,这一算法很容易推广到n方的情况。现在假设有三个实体A、B、C,它们需要使用Diffie-Hellman方法得到一个共享的密钥。
图3 由三个实体组成的一组执行Diffie-Hellman密钥协商过程
首先,A、B、C 交换公开值 g、n;然后每个实体分别产生一个私有值 x、y、z(图3(a))。
如图3(b)所示,实体A计算出X,并把它发送给实体B;B计算出Y,并把它发送给C;C计算出Z并把它发送给A。
在第二轮中,每个实体分别利用自己私有的值及在上一步中从另一方那接收到的值计算出新值,该值是以接收到的值为底,以自己私有的值为指数计算的幂值,然后依次传给相邻方(图3(b))。
现在,各方都利用各自的私有值,计算出共享的密钥(图3(b)的右下角)。
就像我们前面所描述的三个用户的例子那样,Diffie-Hellman算法可以扩展到n个用户组成的一个群体,使用相同的方式执行这个方案。首先,这个群体可设想成已围成一个圆,并以顺时针方向与它紧接着的用户进行通信。如图3(b)所示的环操作就要进行 n-1 次。在每次迭代中,根据上一次从相邻用户那接收到的值,以各自私有值的为指数计算,将结果再传送给下一个相邻用户。
2、使用公共目录服务的Diffie-Hellman
在一个用户群内,使用 Diffie-Hellman 密钥协商协议的另一种方法是让每个实体发布它的公开Diffie-Hellman元件到公开的的目录服务器上。实体A希望与实体B建立一个共享的密钥,它就在目录服务器上查找实体B的Diffie-Hellman公开值,然后计算出密钥。同样的,实体B找回A的Diffie-Hellman公开值,并计算相同的密钥。这个方案使团体里的成员可以和其他成员间共享密钥而不需交换任何秘密信息,而使用之前介绍的方法,则需交换n(n-1)/2个密钥。图4描述了使用一个公共目录服务器的Diffie-Hellman方法。
图4 使用公共目录服务器进行Diffie-Hellman密钥协商
注意,Diffie-Hellman密钥协商方案并不涉及身份认证。当参与这个密钥协商协议时,用户必须还要依靠额外的身份认证机制。也就是说,实体A不能确保实体B的身份,即使已经与B进行了密钥协商交换。
3、经过认证的密钥交换
由Bellovin和Merritt提出的加密密钥交换算法(EKE)把实体身份认证嵌入到密钥协商协议中,因此避免了冒充者进行密钥协商交换。这保证了只在合法实体间建立安全通道。EKE算法步骤概括如下:
假定实体A、B共享一个密码p。
A生成一个公钥对;用一个对称加密算法对公钥部分以p为密钥进行加密,并把它的身份和加过密的公钥传给B。
B用p解开得到公钥;然后生成会话密钥K,并用公钥对之加密,再把它发送给实体A。
A用私钥解开得到会话密钥。
接着,这两个实体使用所得的会话密钥进入加过密的Challenge/Response交互过程。EKE算法可以用来补充 Diffie-Hellman 密钥交换过程,这时可通过利用共享密码的单向变换值来加密一个实体的公钥。
IETF 通过 RFC 2875 推荐使用一个算法,通过使用这一算法,当公钥用于Diffie-Hellman密钥协商过程时,提供拥有相应私钥的证据。特别的,这一 RFC应用于需要通过RSA公司的公钥加密标准(PKCS #10)报文格式对公开的Diffie-Hellman密钥进行认证的情形。PKCS#10通常假设所要求用于认证的公钥算法能够用来进行数字签名。虽然这个建议应用于一个特定的范围内,但它可以推广到任一个Diffie-Hellman密钥交换中。
4、Kerberos和公钥加密
Kerberos团体已经向IETF提议,定义一个基于公钥技术的算法以获得一个主会话密钥。这一建议特别提到了在和 KDC 服务器进行最初认证时使用公钥技术。Kerberos 协议的扩展已经建议允许客户使用他的/她的公钥和数字签名,而不必一定使用传统的密钥。接到这个请求后,KDC就校验其签名,然后就像以前一样,给客户发一个TGT。具有TGT的回复信息的受保护部分或者使用 Diffie-Hellman 得到的密钥或者使用用户的公钥进行加密。这信息是通过KDC的公钥签名认证的。
在 Kerberos 中使用公钥技术的优点包含简化的密钥管理(如,KDC 不再需要安全地管理可能的大量密钥)。对于使用 Kerberos 的客户,既可以使用传统的密钥方式,也可以使用公钥方式,也可以二者兼用。另外,通过这样的扩展,使得即使出现公钥加密和应用时,Kerberos也是个可行的密钥发布协议。
(六)数字签名
公钥加密算法提出后,通过利用单向哈西函数,就能够实现对文档进行数字签名。数字签名可以保障数据的源认证以及支持抗抵赖服务。使用公钥对中的私钥来进行数据流的加密,本身可以保证这一数据是由私钥的拥有者产生,但是为了建立这种保证,加密整个文档就显得太不合算了。幸而有另外的方法,可以不必加密整个文档就能建立这种保证。其中,两种有名的数字签名算法就是RSA和DSA算法。
1、RSA数字签名
RSA数字签名算法主要有两个步骤:
通过使用一种通用的哈西函数,比如 MD5或安全 HASH算法(SHA-1),形成文档的摘要(digest),摘要要比原文档小得多。
不必加密整个文档,只是加密所产生的摘要。
如果不需要考虑保密性要求,经过签名的文档就可以以明文的方式发送出,数字签名同时提供给接受方用于验证。
图5详细说明了RSA签名计算和验证过程。
图5 RSA签名计算和验证过程
2、DSA数字签名
其他种类的数字签名算法,通常只需要该算法能够进行数字签名,而不必进行加密,如标准数字签名算法(DSA),这一算法是美国政府标准。DSA通过使用单向哈西函数SHA-1,能够对任意长的输入数据产生签名。它使用5个公开参数和一个密钥。最开始时,DSA中的密钥长度只是512位,目前已经扩展到1024位。
对于明文P所产生的最后签名,包含两个160比特的整数(r,s)满足:
r=(gkmod p)modq
s=(k-1(hash(P)+xr)mod q
通过使用DSA密钥中的公开参数以及s和报文,可以进行验证过程。使用如下公式,成功的验证可以得出与签名值r相等的值v。
w=s-1mod q
u1=(hash(P)*w)modq
u2=rw mod q
v=((gu1×yu2)mod p)mod q
这里,p是512位到1024(64的倍数)位间的素数。q是p-1的一个160位的素因子;k是一个小于q的由签名人产生的随机数;x(密钥)是一个小于q的整数;y是满足
y=gxmod p
的p位数,而g是由式
g=h(p-1)/qmodp
算得;h是小于p-1的整数,且满足
h(p-1)/qmod p>1
由于r的值不依赖于所要签名的数据,可以先计算出r的值,这样可提高DSA的运行速度。图6说明了使用DSA的签名和认证过程。
图6 使用DSA算法的签名和认证过程
(七)混合公钥服务
将数字签名和公钥密码加密结合在一起,就可以形成很多方案,这些方案可以同时取得公钥密码学所能够提供的各种服务。假设如下情形,A希望在加密通道上和B通信,而且需要保证数据的完整、保密和源认证。
A计算出报文的摘要,进行加密,然后签名。
A将报文和所产生的签名,利用预先定义的分隔符号连接在一起,然后对所得结果用B的公钥加密,再把这一报文传送给B。
B利用自己的私钥解开报文,从而实现数据保密。
B 将签名和报文从数据包中取出,利用 A 的公钥,验证签名,这样就实现了数据的完整性、源认证和抗抵赖服务。
该情形中,签名包含在保密的数据包中,这样通信的两个实体都可以使用他们自己的私钥以及对方的公钥,如图7所示。
图7 混合公钥服务
另外,如果在这些协议的步骤中,使用一些如时间戳或与时间相关的随机数,还可以防止数据监听者的重放攻击。
三、公钥基础设施介绍
公钥密码技术似乎已经完美地解决了密钥密码技术中的密钥管理和密钥发布的问题,所有人都可以用公钥来加密数据,但只有私钥的所有者才能够解密。我们例子中的用户团体曾经为密钥的发布问题所困扰,但现在就可以利用公钥加密技术来进行安全通信,而只需要共享一个数据库,在这个数据库中存有所有用户的公钥。
现在假设某种情况中,该团体中的两个成员,Elyes和Aicha希望她们之间建立一条安全通道。Elyes从公钥库里寻找Aicha的公钥,然后用它加密数据并把加过密的消息发送给Aicha。现在假设另外一个成员,Alice想在这条通信通道上进行窃听,如图8所示。首先,在这一安全通道建立之前,Alice把公钥库里的Aicha的公钥替换成她自己的公钥,然后,在第二步中,Elyes以为她找到的是Aicha的公钥,而实际上,这是Alice的公钥。第三步,Elyes 用在第二步获得的公钥对信息包进行加密然后发送给 Aicha。第四步,Alice拦截了信息包,并用她的密钥成功地破解了信息包,阅读了信息后,再使用Aicha的公钥对信息再加密,然后发送。最后,Aicha 接收到信息包,用她的密钥进行解密,但是这个信息包已经被偷看。
图8 被第三方窃听者偷换公钥
引起这一攻击的问题主要在于,在使用公钥前,没有安全地验证这一公钥确实属于它所声称属于的那一主体。这样就产生了一个难题,如何使得一个用户,我们一般称作证书信赖方(relying party),能够安全可靠地验证某一个公钥确实属于某一个所有者。
这个问题的一个解决方法是,利用公钥基础设施(PKI)的认证过程。PKI 的核心思想在于我们刚介绍的数字签名原理。依赖公钥服务的各方都只依赖一个实体,即所谓的认证中心(CA)。在一个用户的公钥广为散播之前,CA 用自己的私钥来对这一公钥进行签名,然后存入一个公开的公钥库中。可验证公钥的这一思想,可以追溯到在[KOHN78]出版的著作。
证书信赖方(relying party)安全安装了可信的CA的公钥后,就可以用它来验证每个其他用户公钥的签名,并依次决定是否可用。只有当证书信赖方(relying party)成功校验之后,才与对方开始安全通道会话。对于那些没有经这个CA签名的公钥的攻击者,这一简单的方法可以防止他们的攻击。但是对于那些有这一CA签名公钥的攻击者,这一防范措施就无效了。
为了建立可靠的安全保证,一个复杂的公钥认证过程比简单签名一个加密密钥需要更多的安全元素。这些元素要被嵌入到要被鉴定的数据结构中。对于因特网来说,这一结构被称作X.509第3版证书,而实现它的安全基础设施则被称为X.509公钥基础设施(PKIX),存放证书的结构则是LDAP协议构造的。
正如我们所讨论的,密钥加密中的问题在于将密钥安全地发布给一个实体,而对于公钥加密,则问题在于安全地确认公钥与某一主体的归属关系。公开的可在安全的或不安全的通道上发布的加密密钥,可以存储在公开的目录服务中。已确认的公钥就是那些已经与所有者建立安全准确绑定关系的那些公钥,而这一绑定关系无论传输模式、存储模式或者是处理方式如何都仍然有效。
在互联网中,公钥设施是通过可信的第三方,被称为CA的认证中心利用X.509数字证书来定义和维护的。认证过程的输出就是X.509证书形式的一个数据结构,它代表了公钥及其持有者间的一种密码学绑定关系,这一认证过程的核心就是数字签名技术。PKIX 就是因特网公钥基础设施;抽象语法记法(ASN.1)就是用于描写PKIX结构的符号语言。
在公钥值上加一个数字签名,就构成了一个最简单的证书。不过这一证书易于遭到伪造攻击,而且其中也没有任何有关这一证书的持有者以及签发者的信息。而且,像这样简单的签名一个公钥,也不便于管理证书和公钥。除了公钥之外,一个全面的公钥证书还应当包含其他属性,这些属性和公钥值加起来,再进行数字签名。
由于公钥证书对于快速发展的互联网计算的重要性,IETF在其安全领域内已经着手建立有关公钥基础设施方面的标准,PKIX工作组因此而产生。
IETF是一个由网络设计者、运行者、厂商以及研究者组成的国际组织,致力于因特网结构及相关运行标准的演化。IETF 根据各个主题分成不同的技术领域(如安全),技术工作主要以工作组为单位展开。IETF所采取的建立标准的流程与其他组织相似,首先,提交一份类似于细节详述的草案用于描述某个特定的技术问题,这一草案然后被公开以便为大家所阅读和评论。基于所得到的反馈,一些草案成为了推荐的协议(RFC),一些草案有可能成为信息性的文档,而还有一些则会因过时而被废弃。
(一)PKIX证书和证书注销列表(CRL)
1995年,X.509版本3证书被PKIX工作组采纳,用以实现互联网络PKI数字证书。X.509最早来源于ITU X.509版本3,它定义了一系列数字证书的广泛遵从的基本规定,这些规定具有普遍的意义,可以被很多安全协议和应用程序所采纳。
具有一般化意义的X.509版本3的核心一点在于,它包含了一个扩展域,这一扩展域提供了一种标准且灵活的方法,可以用来解释与证书用户相关的动态属性。因此,很多互联网协议和应用都使用了这个域。类似的,CRL版本2的轮廓已经被PKIX工作组提出,CRL主要是用来识别那些已经不再有效或者是被CA注销的证书。通过使用扩展域,CRL版本2也可以应用于大多数的安全协议。
(二)PKIX元素
简单说来,PKIX 可以定义为一系列软件、政策、流程以及人机界面的混合。目的是产生、散发和管理两类数据结构:X.509版本3证书和X.509版本2 CRL。前者建立了一个公钥和某一个持有者的绑定,而后者则注销这种绑定。根据定义,PKIX 包含以下这些元件:
一个或多个颁发和注销公钥证书(PKC)的CA。
一个或多个注册管理中心(RA),他们保证公钥和其他一些属性、证书持有者的身份之间的绑定。
被颁布证书,能够签名、加密数据文档或参与密钥协商协议的证书持有者。
在知道某个可信CA的公钥的基础上,能够与基础设施交互以取得证书、触发证书注销请求、验证证书和CRL的有效性的客户。
存储证书和证书注销列表(CRL)的数据库。
可能还会有一个或多个证书的鉴定代理。
微信公众号:计算机与网络安全
ID:Computer-network